#ifndef ANNEAL_H_
#define ANNEAL_H_

#include "stl-helper.h"

struct Anneal {
  int n_base_, motif_length_;

  Anneal(int n_base, int motif_length) : n_base_(n_base), motif_length_(motif_length) {}

  void generate_freq(vvd_t& freq);
  void generate_data(int n_seq, int seq_length, const vvd_t& freq, vvi_t& data, vi_t& motif_pos);
  void generate_data(int n_seq, int seq_length, const vvd_t& freq, const vd_t& pos_prob, vvi_t& data, vi_t& motif_pos);
  void generate_pos(const vvi_t& data, vi_t& motif_pos);

  void print_freq(const vvd_t& freq);
  void print_data(const vvi_t& data, const vi_t& motif_pos);
  void save_data(const std::string& fn, const vvi_t& data, const vi_t& motif_pos);
  void save_freq(const std::string& fn, const vvd_t& freq);
	    
  double score(const vvi_t& data, const vi_t& motif_pos);
  void compute_freq(const vvi_t& data, const vi_t& motif_pos, vvd_t& freq);
  double compute_score(const vvi_t& data, const vi_t& motif_pos, const vvd_t& freq);
  
  void anneal(const vvi_t& data, const vi_t& start_pos, vi_t& end_pos, vvd_t& end_freq);
  
  static int sample(const vd_t& f);
};

void anneal_test();
void anneal_real_test();

#endif
